import joblib
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score
# 1、读取数据
path = "data/breast-cancer-wisconsin.data"
#因为这个数据集数据没有名称，因此要为数据添加名称
column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size',
               'Uniformity of Cell Shape','Marginal Adhesion',
               'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
               'Normal Nucleoli', 'Mitoses', 'Class']
data = pd.read_csv(path, names=column_name)
# 2、数据处理
# 缺失值处理 数据集中有一些数据缺失，要将 ?替换掉
# 1）替换-》np.nan 将数据标记成无效值
data = data.replace(to_replace="?", value=np.nan)
# 2）删除缺失样本，因为他是去找nan数据，将具有nan数据类型的数据删除
data.dropna(inplace=True)
#data.isnull().any() # 不存在缺失值 如果输出都为False ，则说明输出不存在缺失值
# 3、划分数据集
# 筛选特征值和目标值
x = data.iloc[:, 1:-1]
y = data["Class"]
x_train, x_test, y_train, y_test = train_test_split(x, y)
#4.特征工程 标准化数据集
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 5、预估器流程
# estimator = LogisticRegression()
# estimator.fit(x_train, y_train)

# 保存模型
# joblib.dump(estimator, "my_ridge.pkl")
# 加载模型
estimator = joblib.load("my_ridge.pkl")

# 5）得出模型
print("权重系数为：\n", estimator.coef_)
print("偏置为：\n", estimator.intercept_)
# 6、模型评估
# 方法1：直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
# 方法2：计算准确率
#这个是测量模型的准确性，通过测试集来看训练集训练出来的模型
score = estimator.score(x_test, y_test)
print("准确率为：\n", score)
#因为我们更想知道判断癌症的准确率
# 查看精确率、召回率、F1-score
report = classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "恶性"])
print(report)
# y_true：每个样本的真实类别，必须为0(反例),1(正例)标记
# np.where(三元运算符)将y_test 转换成 0 1,因为roc_auc_score这个指标只能传入0和1
y_true = np.where(y_test > 3, 1, 0)
print(roc_auc_score(y_true, y_predict))